package gitobject;

import sha1.SHA1;
import zlib.ZLibUtils;

import java.io.*;

public class Blob extends GitObject{

    public String getFmt(){
        return fmt;
    }
    public String getMode(){
        return mode;
    }
    public String getPath() {
        return path;
    }
    public String getValue(){
        return value;
    }
    public String getKey() { return key; }
    public Blob(){};

    /**
     * Constructing blob object from a file
     * @param file
     * @throws Exception
     */
    // 接收一个文件对象，由此创建blob对象
    public Blob(File file) throws Exception {
        // 设置类型
        fmt = "blob";
        // 100644:表示这个文件是一个普通文件
        mode = "100644";
        // 获得该文件对象的内容
        value = getValue(file);
        // 根据文件头（"blob"+ ” “ + value.length + "\0"）和文件内容（value)生成对应的key值
        genKey(file);
        // 压缩文件的内容，并写入blob对象内(取消自动序列化，后续在JitHash手动序列化)
//        compressWrite();
    }

    /**
     * Deserialize a blob object from an existed hash file in .jit/objects.
     *
     * @param Id
     * @throws IOException
     */
    // 将一个现存的blob哈希文件反序列化
    public static Blob deserialize(String Id) throws IOException {
        // 创建一个blob对象，设置初始属性
        Blob blob = new Blob();
        blob.fmt = "blob";
        blob.mode = "100644";
        File file = new File(path + File.separator + Id.substring(0,2) + File.separator + Id.substring(2));

        // 如果文件存在，那么将创建的blob对象的key值，绑定其id值，将文件的内容转为字符串读出
        if(file.exists()){
            blob.key = Id;
            FileInputStream input = new FileInputStream(file);
            byte[] byt = ZLibUtils.decompress(input);
            blob.value = new String(byt);
            input.close();
        }
        return blob;
    }

    /**
     * Generate key from file.根据文件对象生成对应的key值
     * key值的计算公式如下：
     * Key = sha1(file_header + file_content)
     * 其中，file_content = value
     * file_header="blob" + ” “ + value.length +“\0"
     *
     * @param file
     * @return String
     * @throws Exception
     */
    public String genKey(File file) throws Exception {
        key = SHA1.getHash(fmt+" "+value.length()+"0"+value);
        return key;
    }

    public String indexBlob(File file) throws Exception {
        return mode+" "+ fmt + " " + key + " " ;
    }

    @Override
    public String toString(){
        return mode+" "+fmt+" " + key;
    }
}
